﻿using BLToolkit.DataAccess;
using BLToolkit.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BLToolkit.Data;
using Devsoft.DB.Models;

namespace Platform.Model
{
    [TableName("ViewLack")]
	public class Lack : Devsoft.DB.Models.Flat.Model<Lack>
    {
        /// <summary>
        /// Mã nhà cung cấp
        /// </summary>
        public string SupNo { get; set; }


        /// <summary>
        /// tên nhà cung cấp lượng hàng cho siêu thị
        /// </summary>
        public string SupName { get; set; }


        /// <summary>
        /// mã số đặt hàng
        /// </summary>
        public string OrderNo { get; set; }

        /// <summary>
        /// mã mặt hàng
        /// </summary>
        public string ArtNo { get; set; }

        /// <summary>
        /// tên mặt hàng
        /// </summary>
        public string ArtName { get; set; }

        /// <summary>
        /// mã kho
        /// </summary>
        public string StoreNo { get; set; }

        /// <summary>
        /// khối lượng hàng của siêu thị đặt
        /// </summary>
        public float OrderQty { get; set; }

        /// <summary>
        /// Khối lượng hàng Platform đã giao
        /// </summary>
        public float DeliQty { get; set; }

        /// <summary>
        /// số khay đựng hàng
        /// </summary>
        public int Package { get; set; }

        /// <summary>
        /// hao hụt tự nhiên mặt hàng
        /// </summary>
        public float NLoss { get; set; }

        /// <summary>
        /// hao hụt sơ chế mặt hàng
        /// </summary>
        public float PLoss { get; set; }
        /// <summary>
        /// khối lượng hàng mà platform giao thiếu( tính theo đơn vị Kg)
        /// </summary>
        public float DifferKg { get; set; }

        /// <summary>
        /// phần trăm lượng hàng Platform giao thiếu cho siêu thị (đơn vị %)
        /// </summary>

        public float DifferPc
        {

            get;
            set;
        }

        /// <summary>
        /// trạng thái của lần giao hàng (luôn bằng Thiếu vì bảng Lack chỉ chứa hàng thiếu)
        /// </summary>
        public string Status
        {
            get
            {
                if (DifferKg >= 0) return "Đủ";
                return "Thiếu";
            }
        }

        public int MarketId { get; set; }

        /// <summary>
        /// Ngày
        /// </summary>
        /// <returns></returns>
        public DateTime OrderDate { get; set; }

        public List<Lack> GetDS()
        {
            var result = from c in Lack.Objects
                         orderby c.SupName ascending
                         where c.MarketId == WorkSession.Current.Market.ID
                         select c;
            return result.ToList();
        }
        public static List<Lack> DS()
        {
            var result = from c in Lack.Objects
                         select c;
            return result.ToList();
        }
       
       
        /// <summary>
        /// Lấy danh sách hàng thiếu và gom nhóm theo nhà cung cấp
        /// </summary>
        /// <returns></returns>
        public IQueryable<Lack> Lack_GroupbySupplier()
        {
            var result = from c in Lack.Objects
                         group new { c.OrderQty, c.DeliQty } by new { c.SupName, c.SupNo }
                             into g
                             select new Lack()
                             {
                                 SupNo = g.Key.SupNo,
                                 SupName = g.Key.SupName,
                                 OrderQty = g.Sum(p => p.OrderQty),
                                 DeliQty = g.Sum(p => p.DeliQty)
                             };
            return result;
        }

        /// <summary>
        /// Lấy danh sách hàng thiếu gom nhóm theo từng kho
        /// </summary>
        /// <returns></returns>
        public IQueryable<Lack> Lack_GroupbyStore()
        {
            var result = from c in Lack.Objects
                         group new { c.OrderQty, c.DeliQty } by new { c.StoreNo }
                             into g
                             select new Lack()
                             {
                                 StoreNo = g.Key.StoreNo,
                                 OrderQty = g.Sum(p => p.OrderQty),
                                 DeliQty = g.Sum(p => p.DeliQty)
                             };
            return result;
        }

        /// <summary>
        /// Lấy danh sách nhà cung cấp và gom nhóm theo mặt hàng
        /// </summary>
        /// <returns></returns>
        public IQueryable<Lack> Lack_GroupbyArticle()
        {
            var result = from c in Lack.Objects
                         group new { c.OrderQty, c.DeliQty } by new { c.ArtNo, c.ArtName }
                             into g
                             select new Lack()
                             {
                                 ArtNo = g.Key.ArtNo,
                                 ArtName = g.Key.ArtName,
                                 OrderQty = g.Sum(p => p.OrderQty),
                                 DeliQty = g.Sum(p => p.DeliQty)
                             };
            return result;
        }
    }

    public abstract class LackManager : Manager<Lack>
    {
        public LackManager(DbManager dbManager)
            : base(dbManager)
        {
        }

        public  abstract List<Lack> Lack_GetbyArt(string artno);
    }
}
